/* AJAX远程调用，参数是一个JSON对象，
/* 1.param url：请求地址，默认空字符串
/* 2.param type： 请求方式，可选get/post，默认get
/* 3.param data： 请求参数，仅在post请求时生效
/* 4.param contentType 请求参数的格式，可选json/qs，默认qs
/* 5.param dataType 响应数据的格式，可选text/json,默认text
/* 6.param success 回调函数，函数的第一个参数为响应数据
/* 7.param async 是否开启异步，默认true
 */
function ajax(params) {
    //创建AJAX核心对象：该对象负责与服务器进行通信
    let xhr=new XMLHttpRequest();
    //处理url参数，默认为空字符串
    let url=params['url']?params['url']:'';
    //处理type参数，默认为get
    let type=params['type']?params['type']:'get';
    //处理contentType参数，默认为qs
    let contentType=params['contentType']?params['contentType']:'qs';
    //处理dataType参数，默认为qs
    let dataType=params['dataType']?params['dataType']:'json';
    //处理async参数，默认为qs
    let async=params['async']?params['async']:true;

    //挂载监听事件：该事件在请求状态码发生改变时触发，必须写于xhr.open（）之前
    xhr.onreadystatechange=()=> {
        //请求完成，响应成功，存在回调函数（通知）
        if (xhr.readyState === 4 && xhr.status === 200&&params['success']) {
            //若响应数据为text，则将数据数据设置到回调函数的第一个参数上
            if (dataType==='text'){
                params['success'](xhr.responseText);
            }
            //若响应数据为json，则将数据数据解析为JSON对象后，设置到回调函数的第一个参数上
            else {
                params['success'](JSON.parse(xhr.responseText));
            }
        }
    }
    //建立异步通道：请求类型，请求地址，是否异步
    xhr.open(type,url,async);
    if ('get'===type){
        xhr.send();
    }
    else {
        //设置请求头中的请求数据格式
        if ('qs'===contentType){
            xhr.setRequestHeader('Content-Type','application/x-www-form-urlencoded');
        }
        else {
            xhr.setRequestHeader('Content-Type','application/json');
        }
        xhr.send(params['data']);
    }
}